1 package edu.jiangxin.apktoolbox.pdf;
2
3 import org.apache.pdfbox.io.RandomAccessReadBuffer;
4 import org.apache.pdfbox.pdfparser.PDFParser;
5 import org.apache.pdfbox.pdmodel.PDDocument;
6 import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
7 import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo;
8 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
9 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
10 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
11 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
12 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode;
13 import org.junit.jupiter.api.Test;
14
15 import java.io.File;
16 import java.io.FileInputStream;
17 import java.io.IOException;
18
19 public class PdfOutlineTest {
20 String path = "target/test-classes/pdf/";
21
22 public void alterOutline(PDOutlineNode pdOutlineNode, String indentation) throws IOException {
23
24 PDOutlineItem currentPdOutlineItem = pdOutlineNode.getFirstChild();
25 while (currentPdOutlineItem != null) {
26 if (currentPdOutlineItem.getDestination() instanceof PDPageDestination) {
27 PDPageDestination pdOutlineItemDestination = (PDPageDestination) currentPdOutlineItem.getDestination();
28 pdOutlineItemDestination.setPageNumber(pdOutlineItemDestination.retrievePageNumber() + 25);
29 }
30 if (currentPdOutlineItem.getAction() instanceof PDActionGoTo) {
31 PDActionGoTo pdActionGoTo = (PDActionGoTo) currentPdOutlineItem.getAction();
32 if (pdActionGoTo.getDestination() instanceof PDPageDestination) {
33 PDPageDestination pd = (PDPageDestination) pdActionGoTo.getDestination();
34 pd.setPageNumber(pd.retrievePageNumber() + 25);
35 }
36 }
37 alterOutline(currentPdOutlineItem, indentation + " ");
38 currentPdOutlineItem = currentPdOutlineItem.getNextSibling();
39 }
40 }
41
42 public void printOutline(PDOutlineNode pdOutlineNode, String indentation) throws IOException {
43 PDOutlineItem currentPdOutlineItem = pdOutlineNode.getFirstChild();
44 while (currentPdOutlineItem != null) {
45 int pages = 0;
46 StringBuilder extraInfo = new StringBuilder();
47 PDDestination pdDestination = currentPdOutlineItem.getDestination();
48 extraInfo.append(indentation + currentPdOutlineItem.getTitle());
49 if (pdDestination instanceof PDPageDestination) {
50 PDPageDestination pdOutlineItemDestination = (PDPageDestination) pdDestination;
51 pages = (pdOutlineItemDestination.retrievePageNumber() + 1);
52 extraInfo.append(":").append(pdDestination.getClass().getSimpleName()).append(":").append(pages);
53 } else {
54 PDAction pdAction = currentPdOutlineItem.getAction();
55 if (pdAction instanceof PDActionGoTo) {
56 PDActionGoTo pdActionGoTo = (PDActionGoTo) pdAction;
57 pdDestination = pdActionGoTo.getDestination();
58 if (pdDestination instanceof PDPageDestination) {
59 PDPageDestination pd = (PDPageDestination) pdDestination;
60 pages = (pd.retrievePageNumber() + 1);
61 extraInfo.append(":PDActionGoTo:").append(pdDestination.getClass().getSimpleName()).append(":").append(pages);
62 }
63 }
64 }
65
66 System.out.println(extraInfo);
67 printOutline(currentPdOutlineItem, indentation + " ");
68 currentPdOutlineItem = currentPdOutlineItem.getNextSibling();
69 }
70 }
71
72 @Test
73 public void testPrintOutline() {
74 File file = new File(path, "R常用函数整理.pdf");
75 if (!file.exists()) {
76 System.err.println(" file is not exists ");
77 return;
78 }
79 try (FileInputStream fis = new FileInputStream(file)) {
80 PDFParser parser = new PDFParser(new RandomAccessReadBuffer(fis));
81 try (PDDocument document = parser.parse()) {
82 PdfOutlineTest pdfOutlineTest = new PdfOutlineTest();
83 PDDocumentOutline pdDocumentOutline = document.getDocumentCatalog().getDocumentOutline();
84 if (pdDocumentOutline != null) {
85 pdfOutlineTest.printOutline(pdDocumentOutline, "");
86 } else {
87 System.out.println("This document does not contain any outline");
88 }
89 }
90 } catch (IOException ex) {
91 System.err.println("IOException");
92 }
93 }
94
95 @Test
96 public void testAlterOutline() {
97 File file = new File(path, "R常用函数整理.pdf");
98 if (!file.exists()) {
99 System.err.println(" file is not exists ");
100 return;
101 }
102 try (FileInputStream fis = new FileInputStream(file)) {
103 PDFParser parser = new PDFParser(new RandomAccessReadBuffer(fis));
104 try (PDDocument document = parser.parse()) {
105 PdfOutlineTest pdfOutlineTest = new PdfOutlineTest();
106 PDDocumentOutline pdDocumentOutline = document.getDocumentCatalog().getDocumentOutline();
107 if (pdDocumentOutline != null) {
108 pdfOutlineTest.alterOutline(pdDocumentOutline, "");
109 } else {
110 System.out.println("This document does not contain any outline");
111 }
112 document.save(new File(path, "R常用函数整理_altered.pdf"));
113 }
114 } catch (IOException ex) {
115 System.err.println("IOException");
116 }
117 }
118 }